/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package propres;
import java.util.*;
/**
 *
 * @author neochange
 */
public class CtrlDominiodieta 
{

 private dieta D;
 private CtrlDominioalimento CDa;
 private CtrlDominioCliente CDc;
 private CtrlDominioplato CDp;
 

public CtrlDominiodieta()
{
D = new dieta();
CDa = new CtrlDominioalimento();
CDc = new CtrlDominioCliente();
}
 

public CtrlDominiodieta(CtrlDominioCliente T, CtrlDominioalimento E, CtrlDominioplato Y)
{
D = new dieta(); 
CDa = E;
CDc = T;
CDp = Y;


}

 
public List<List<String>[][]> generar(Date fecha_ini, Date fecha_f,int dietap, int[] tbit, int numdias, boolean generados) throws Exception
{
List<List<String>[][]> Y = new ArrayList();
List<String>[][] S = new ArrayList[5][7];

System.out.println("Genero la dieta: "+dietap);

arbol a = new arbol();

System.out.println("alims: "+CDa.consult_alimentos());

System.out.println("lista platos: "+D.lista_platos(CDa.consult_alimentos(), CDa.get_estruc()));

for(int g =0; g < tbit.length;g++){
System.out.print(tbit[g]);
}
System.out.print('\n');

System.out.println("prefs:"+ CDc.cons_pref());
System.out.println("numero de dias: "+numdias);

List<plato> J = new ArrayList();
if(generados){
J = D.lista_platos(CDa.consult_alimentos(), CDa.get_estruc());
}
else{
J = CDp.lista_platos();
}

a.copia_arbol(D.generar_dieta1(D.genera_diauto(J, tbit,CDc.cons_pref() , numdias+6), fecha_ini, numdias, CDc.cons_pref(), 3, tbit),CDc.cons_pref());
// el 3 de copia_arbol es el nivel del arbol

System.out.println("dieta generada con tamaño "+ a.altura());

List<dieta> O = new ArrayList();
O=a.recogeEnOrden();



D = O.get(dietap);
int diadieta = 0;

if(numdias>7){  // Peticion con mas de una semana
    int i = 0;
    while((numdias%7==0 && numdias/7>i) || (numdias%7!=0 && numdias/7>=i)){ // iteracion para cada semana // no va bien para 2 semanas

        int j=0;
        while(j<7 && diadieta < D.consultar_dias().size()){ // iteracion por dia de semana
            int k=0;
            //Date t = new Date(fecha_ini.getYear(),fecha_ini.getMonth(),fecha_ini.getDate());
            dia di = new dia();
            di = (dia) D.consultar_dias().get(diadieta); // hay que consultar en general no hasta 7
            diadieta++;
            while(k<5){ // iteracion por comida de un dia
                List<plato> G = new ArrayList();
                G = di.lplatos_comida(k);
                int l = 0;
                    while(l < G.size() ){  // iteracion de platos de una comida
                           if(S[k][j]==null){
                            S[k][j] = new ArrayList();
                        }
                    S[k][j].add(G.get(l).Get_Nombre());
                    l++;
                    }   
            k++;
            }
        j++;
        }
    Y.add(S);
    S = new ArrayList[5][7];
    i++;
    }
}
else{
        int j=0;

        while(j<D.consultar_dias().size()){ // iteracion por dia de semana // va???
            int k=0;
            Date t = new Date(fecha_ini.getYear(),fecha_ini.getMonth(),fecha_ini.getDate());
            dia di = new dia();
            // comprovar que existe ese dia
            di = (dia) D.consultar_dias().get(j);
            while(k<5){ // iteracion por comida de un dia
                List<plato> G = new ArrayList();
                G = di.lplatos_comida(k);
                int l = 0;
                    while(l < G.size() ){  // iteracion de platos de una comida
                    if(S[k][j]==null){
                    S[k][j] = new ArrayList();
                    }
                    S[k][j].add(G.get(l).Get_Nombre());
                    l++;
                    }   
            k++;
            }
        j++;
        }
    Y.add(S);
}
return Y;
}

public List<List<String>[][]> generar2(Date fecha_ini, Date fecha_f,int dietap, List<int[]> tbit, int numdias,boolean generados) throws Exception
{
List<List<String>[][]> Y = new ArrayList();
List<String>[][] S = new ArrayList[5][7];

System.out.println("Genero la dieta: "+dietap+" modo generar2");

arbol a = new arbol();

System.out.println("alims: "+CDa.consult_alimentos());

System.out.println("lista platos: "+D.lista_platos(CDa.consult_alimentos(), CDa.get_estruc()));

System.out.print('\n');

System.out.println("prefs:"+ CDc.cons_pref());
System.out.println("numero de dias: "+numdias);

List<plato> J = new ArrayList();
if(generados){
J = D.lista_platos(CDa.consult_alimentos(), CDa.get_estruc());
}
else{
J = CDp.lista_platos();
}

a.copia_arbol(D.generar_dietauto(J, fecha_ini, CDc.cons_pref(), 3, tbit),CDc.cons_pref());
// el 3 de copia_arbol es la altura del arbol de soluciones
// no hace falta introcudir el numero de dias de la dieta

System.out.println("dieta generada con tamaño "+ a.altura());

List<dieta> O = new ArrayList();
O=a.recogeEnOrden();

System.out.println(O);

D = O.get(dietap);
System.out.println("hago la asignacion en la dieta");
System.out.println("Generados "+D.consultar_dias()+" dias");
int diadieta = 0;

if(numdias>7){  // Peticion con mas de una semana
    int i = 0;
    while((numdias%7==0 && numdias/7>i) || (numdias%7!=0 && numdias/7>=i)){ // iteracion para cada semana // no va bien para 2 semanas
        int j=0;
        while(j<7 && diadieta < D.consultar_dias().size()){ // iteracion por dia de semana
            int k=0;
            //Date t = new Date(fecha_ini.getYear(),fecha_ini.getMonth(),fecha_ini.getDate());
            dia di = new dia();
            di = (dia) D.consultar_dias().get(diadieta); // hay que consultar en general no hasta 7
            diadieta++;
            while(k<5){ // iteracion por comida de un dia
                List<plato> G = new ArrayList();
                G = di.lplatos_comida(k);
                int l = 0;
                    while(l < G.size() ){  // iteracion de platos de una comida
                           if(S[k][j]==null){
                            S[k][j] = new ArrayList();
                        }
                    S[k][j].add(G.get(l).Get_Nombre());
                    l++;
                    }   
            k++;
            }
        j++;
        }
    Y.add(S);
    S = new ArrayList[5][7];
    i++;
    }
}
else{
        int j=0;

        while(j<D.consultar_dias().size()){ // iteracion por dia de semana // va???
            int k=0;
            Date t = new Date(fecha_ini.getYear(),fecha_ini.getMonth(),fecha_ini.getDate());
            dia di = new dia();
            // comprovar que existe ese dia
            di = (dia) D.consultar_dias().get(j);
            while(k<5){ // iteracion por comida de un dia
                List<plato> G = new ArrayList();
                G = di.lplatos_comida(k);
                int l = 0;
                    while(l < G.size() ){  // iteracion de platos de una comida
                    if(S[k][j]==null){
                    S[k][j] = new ArrayList();
                    }
                    S[k][j].add(G.get(l).Get_Nombre());
                    l++;
                    }   
            k++;
            }
        j++;
        }
    Y.add(S);
}
return Y;
}
    
public List<List<String>[][]> consultar_dieta(Date fech_ini,Date fech_f) throws Exception{

List<List<String>[][]> Y = new ArrayList();
List<String>[][] S = new ArrayList[5][7];

D = CDc.cons_dieta();  


if(D!=null){ // comprobamos que el cliente tiene una dieta

int numdias = D.obtener_dias(fech_ini, fech_f).size(); // numdias es la dif entre fech_ini,fech_f


int diadieta = 0;
List<dia> L = new ArrayList();
L = D.obtener_dias(fech_ini, fech_f);

if(numdias>7){  // Peticion con mas de una semana
    int i = 0;
    while((numdias%7==0 && numdias/7>i) || (numdias%7!=0 && numdias/7>=i)){ // iteracion para cada semana

        int j=0;
        while(j<7 && diadieta < L.size()){ // iteracion por dia de semana
            int k = 0;
            dia di = new dia();
            di = L.get(diadieta); // hay que consultar en general no hasta 7
            diadieta++;

            while(k<5){ // iteracion por comida de un dia
                List<plato> G = new ArrayList();
                G = di.lplatos_comida(k);
                int l = 0;
                    while(l < G.size() ){  // iteracion de platos de una comida
                            if(S[k][j]==null){
                            S[k][j] = new ArrayList();
                        }
                    S[k][j].add(G.get(l).Get_Nombre());
                    l++;
                    }   
            k++;
            }
        
        j++;
        }
    Y.add(S);

    S = new ArrayList[5][7];
    i++;
    }
}
else{
        int j = 0;
        while(j < D.obtener_dias(fech_ini, fech_f).size()){ // iteracion por dia de semana
            int k = 0;
            dia di = new dia();
            // comprovar que existe ese dia, no hace falta, garantizado en invariante

            di = (dia) L.get(j);

            while(k<5){ // iteracion por comida de un dia
                List<plato> G = new ArrayList();
                G = di.lplatos_comida(k);
                int l = 0;
                    while(l < G.size() ){  // iteracion de platos de una comida
                    if(S[k][j]==null){
                    S[k][j] = new ArrayList();
                    }
                    S[k][j].add(G.get(l).Get_Nombre());
                    l++;
                    }   
            k++;
            }
        j++;
        }
    Y.add(S);
}

}

return Y;
}

public void ac_dieta() throws Exception{
    // Introducimos la dieta D en la del cliente en CDc.cliente.dieta

    CDc.set_dieta(enbeber_dieta(D, CDc.cons_dieta(), false)); // se modifica la dieta del cliente
    
}

public void can_dieta(){
    
    // Cancelamos la dieta

    D = new dieta();
        
}

private dieta enbeber_dieta(dieta A, dieta B, boolean inc) throws Exception {
    // Pone la dieta dentro de la otra, si los dias coinciden se añaden los platos
       
    int i = 0;

    while(i < A.consultar_dias().size()){
    
            if(B==null){

            B = new dieta();
            }
            
            B.anadir_dia(A.consultar_dias().get(i));
            i++;
    }
    
return B;    
}

public List<String> gplatos(int generados) throws Exception
{
List<String> R = new ArrayList();
List<plato> K = new ArrayList();

if(generados==1){
K = D.lista_platos(CDa.consult_alimentos(), CDa.get_estruc());
}
else{
K = CDp.lista_platos();
}

int i = 0;
while(i<K.size()){
    R.add(K.get(i).Get_Nombre());
    i++;    
}

return R;
}

public void an_plato(int comida,Date a, String plato,boolean generados) throws Exception
{
    
List<plato> K = new ArrayList();
if(generados){
K = D.lista_platos(CDa.consult_alimentos(), CDa.get_estruc());
}
else{
K = CDp.lista_platos();
}

plato p = new plato();

int i = 0;
while(i<K.size())
{
    if(plato.equals(K.get(i).Get_Nombre())){
    p=K.get(i);
    }   
i++;
}

D = new dieta();
dia di = new dia(a);
D.anadir_dia(di);

D.anadir_pcomida(a, p, comida);
CDc.set_dieta(enbeber_dieta(D, CDc.cons_dieta(), false)); // se modifica la dieta del cliente


}

public void el_plato(int comida,Date fecha, String plato) 
{
List<plato> K = new ArrayList();
List<plato> Y = new ArrayList();

try{
K = D.lista_platos(CDa.consult_alimentos(), CDa.get_estruc());
Y = CDp.lista_platos();
}
catch(Exception e){
System.out.println("Error generando lista de platos");
}

K.addAll(Y);

plato p = new plato();

int i = 0;
boolean v =false;
while(i < K.size() && !v){
if(K.get(i).Get_Nombre().equals(plato)){
v=true;
p = K.get(i);
}
i++;
}
    
D = new dieta();
D = CDc.cons_dieta();

try{
D.eliminar_pcomida(fecha, p, comida);
}
catch(Exception e){
System.out.println(e.getMessage());
}

CDc.set_dieta(D); // se modifica la dieta del cliente

}

public int calc() throws Exception
{
    int g;
    D = CDc.cons_dieta();
    D.calcular_calprec();
    
return D.consultar_precio();
}

public int calc2() throws Exception
{
    int g;
    D = CDc.cons_dieta();
    D.calcular_calprec();
    
return D.consultar_calorias();
}

public List<Date> lista_fechas() throws Exception
{

    List<Date> F = new ArrayList();
    List<dia> J = new ArrayList();
    J = D.consultar_dias();
    
    int s = 0;
    while(s < J.size()){
    F.add(J.get(s).fecha());
    s++;
    }
    
    
return F;
}

}




    